package partTwo;
/* 本类用于多态的入门案例*/
public class TestDemo {
    public static void main(String[] args) {
        //6.创建"纯纯”的对象进行测试(为了好理解，就是直接创建对象）
        Animal2 a = new Animal2();
        Cat2 c = new Cat2();
        Dog d = new Dog();
        //调用方法进行测试
        a.eat();  //小动物Animal吃啥都行
        c.eat();  //小猫爱吃小鱼干,执行子类重写后的功能
        d.eat();  //小狗爱吃肉骨头,执行子类重写后的功能

        /*2.子类可以调用子类的功能，但是父类不能调用子类的特有功能*/
        //a.jump();

        c.jump();  //子类对象可以调用自己的功能
        d.run();   //子类对象可以调用自己的功能

        //8.创建多态进行测试
        /* 3.口诀1：父类引用指向子类对象
         * 解释：创建出来的子类对象地址值，交给父类类型的引用类型变量来保存*/
        Animal2 a2 = new Cat2();
        Animal2 a3 = new Dog();
        a2.eat();
        a3.eat();
        /*4.口诀2：编译看左边，运行看右边
         * 解释：必须要在父类里定义这个方法，才能通过编译
         * 编译时，把多态对象看做父类，必须要在子类中重写父类定义的方法
         * 运行时，方法体使用的是子类的功能*/
        //a2.jump()   报错，无法使用，不是父类功能的重写，父类中未定义此功能
        //a3.run();    报错，无法使用，不是父类功能的重写，父类中未定义此功能
    }
}


/* 1.多态的前提：继承+重写*/
//1.创建父类
class Animal2{
    //3.创建父类的普通方法
    public void eat(){
        System.out.println("小动物Animal吃啥都行");
    }
}


//2.1创建子类小猫
class Cat2 extends Animal2{
    //4.1重写父类的功能--小鱼干
    @Override
    public void eat(){
        System.out.println("小猫爱吃小鱼干");
    }
    //5.1 添加子类的特有功能
    public void jump(){
        System.out.println("小猫Cat跳的老高了");
    }
}

//2.2创建子类小狗
class Dog extends Animal2 {
    //4.2重写父类的功能--肉骨头
    @Override
    public void eat(){
        System.out.println("小狗爱吃肉骨头");
    }
    //5.2添加子类的特有功能
    public void run(){
        System.out.println("小狗Dog跑的老快了");
    }
}